﻿/**
 * 应用程序源码文件
 */
#ifndef STT_HMIAPP_CPP_
#define STT_HMIAPP_CPP_

/*********************
 *   头文件
 *********************/
#include "HmiApp.h"
/*PAGES_HEAD_BEGIN*/
#include "pages/Frm01.h"
#include "pages/Frm02.h"
#include "pages/Frm03.h"
#include "pages/Frm04.h"
#include "pages/Frm05.h"
/*PAGES_HEAD_END*/

using namespace stt;

/********************************
 *
 *  应用程序入口
 *
 *  注意：IDE自动生成，用户勿修改
 *
 ********************************/
IApplication * AppMain(IRuntime* env, char **argv){
	return new HmiApp(env);
}

string getAppArgs() {
	return "{\"r\":0}";
}

/********************************
 *
 *  应用程序类
 *
 *  注意：用户可添加代码
 *
 ********************************/
HmiApp::HmiApp(IRuntime * rt) : HmiAppBase(rt) {
}

HmiApp::~HmiApp() {
}

/********************************
 *
 *  应用构建前调用此函数
 *
 *  注意：用户可添加代码
 *
 ********************************/
void HmiApp::onInit(){
	//用户在此添加客户化代码
}

/********************************
 *
 *  应用构建函数
 *
 *  注意：IDE自动生成，用户勿修改
 *
 ********************************/
void HmiApp::construct() {
	//注册字体文件
	fm->registerFontFile("文泉驿微米黑", "./fnt/wenquanyiweimihei.ttf");
	//背光、屏保
	pm->setBackLightHoldingTime(0, 50);
}

IPagePtr HmiApp::buildPage(string id, uint8_t mode, STTWidget *target) {
	if (id == "Frm02")
		return new Frm02(this, target, "Frm02", "Frm02");
	if (id == "Frm03")
		return new Frm03(this, target, "Frm03", "Frm03");
	if (id == "Frm04")
		return new Frm04(this, target, "Frm04", "Frm04");
	if (id == "Frm05")
		return new Frm05(this, target, "Frm05", "Frm05");
	return new Frm01(this, target, "Frm01", "Frm01");
}

/********************************
 *
 *  构建应用后调用此函数
 *
 *  注意：用户可添加代码
 *
 ********************************/
void HmiApp::onReady(){
	//用户在此添加客户化代码
}

/********************************
 *
 *  应用退出前调用此函数
 *
 *  注意：用户可添加代码
 *
 ********************************/
void HmiApp::onQuit(){
	//用户在此添加客户化代码
}

//#include "curl.h"
//#include <sha.h>
//#include <evp.h>
//#include <ctime>
//#include <random>
//#include <iostream>
//#include <bio.h>
//#include <buffer.h>
//#include <util/StringUtil.h>

size_t HmiApp::handleResponse(void *contents, size_t length, size_t nmemb, void *userp)
{
     ((std::string*)userp)->append((char*)contents, length * nmemb);
     string s = *(string*)userp;//返回结果
     cout<<s<<endl;//打印出来
//     getRuntime()->getIVarMgr()->setChar("onvif_response", s);//赋给变量
     return length * nmemb;
}

void HmiApp::request(string url, string xml) {
//	std::string postField(xml);
//	std::string readBuffer;
//	CURL *curl;
//	CURLcode res;
//	curl = curl_easy_init();
//	if (curl)
//	{
//		struct curl_slist *slist = NULL;
//		slist = curl_slist_append(slist, "Accept: */*");
//		slist = curl_slist_append(slist, "Content-Type: text/xml");
////		slist = curl_slist_append(slist, "SOAPAction: \"http://www.onvif.org/ver10/device/wsdl/GetDeviceInformation\"");
//		std::string content_length = "Content-Length: " + std::to_string(postField.size());
//
//		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
//
//		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
//		curl_easy_setopt(curl, CURLOPT_HEADER, 0);
//		curl_easy_setopt(curl, CURLOPT_URL, url.c_str());//onvif服务地址
//
//		curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30);
//		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postField.c_str());
//		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, handleResponse);
//		curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
//		res = curl_easy_perform(curl);
//
//		if (res != CURLE_OK)
//		{
//			std::cout << "Failed."<<res << std::endl;
//		}
//
//		curl_easy_cleanup(curl);
//		curl_slist_free_all(slist);
//	}
}

// Base64 编码函数
std::string HmiApp::base64_encode(const unsigned char* input, int length) {
//    BIO *bio, *b64;
//    BUF_MEM *bufferPtr;
//
//    b64 = BIO_new(BIO_f_base64());
//    bio = BIO_new(BIO_s_mem());
//    bio = BIO_push(b64, bio);
//
//    BIO_write(bio, input, length);
//    BIO_flush(bio);
//    BIO_get_mem_ptr(bio, &bufferPtr);
//
//    std::string result(bufferPtr->data, bufferPtr->length);
//    BIO_free_all(bio);
//
//    return result;
	return "";
}
//static std::random_device rd;
std::string HmiApp::generate_wsse_header(const std::string& username,
                               const std::string& password) {
	return "";
//    // 生成 16 字节随机 nonce[1,6](@ref)
//    unsigned char nonce[16];
//
//    std::generate(std::begin(nonce), std::end(nonce), [&]{ return rd() % 256; });
//
//    // 生成 ISO 8601 时间戳[1](@ref)
//    char created[64];
//    time_t now = time(nullptr);
//    strftime(created, sizeof(created), "%Y-%m-%dT%H:%M:%SZ", gmtime(&now));
//
//    // 计算 PasswordDigest[1](@ref)
//    std::string digest_input(reinterpret_cast<char*>(nonce), 16);
//    digest_input.append(created).append(password);
//
//    unsigned char digest[SHA_DIGEST_LENGTH];
//    SHA1(reinterpret_cast<const unsigned char*>(digest_input.data()),
//        digest_input.size(), digest);
//
//    // 构建 XML 安全头
//    string pwd(base64_encode(digest, SHA_DIGEST_LENGTH));
//    string nce(base64_encode(nonce, 16));
//    pwd = StringUtil::trim(pwd, '\n');
//    nce = StringUtil::trim(nce, '\n');
//    return R"(
//<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
//  <wsse:UsernameToken>
//    <wsse:Username>)" + username +R"(</wsse:Username>
//    <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">)" + pwd + R"(</wsse:Password>
//    <wsse:Nonce>)" + nce + R"(</wsse:Nonce>
//    <wsu:Created>)" + created + R"(</wsu:Created>
//  </wsse:UsernameToken>
//</wsse:Security>
//)";
}

#endif /* STT_HMIAPP_CPP_ */


